home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vgacodng / part03_b.pas < prev    next >
Pascal/Delphi Source File  |  1996-11-22  |  2KB  |  77 lines

  1. program Scrolly2;
  2.  
  3. uses crt;
  4.  
  5. const VGA = $A000;
  6.       Bits : array[0..7] of byte =
  7.                (128,64,32,16,8,4,2,1);
  8.       Text : string = 'Ein Scrolly im VGA-Modus 13'+
  9.                       'h, er scrollt und scrollt u'+
  10.                       'nd scrollt.................';
  11.  
  12. var FontSeg,FontOfs : word;
  13.  
  14. procedure WaitRetrace;assembler;
  15. asm
  16.   mov     dx,3DAh
  17. @l1:
  18.   in      al,dx
  19.   and     al,08h
  20.   jz      @l1
  21. @l2:
  22.   in      al,dx
  23.   and     al,08h
  24.   jz      @l2
  25. end;
  26.  
  27. procedure GetFont;assembler;
  28. asm
  29.   mov     ax,1130h
  30.   mov     bh,3          { Font-Nummer für 8x8-Font }
  31.   int     10h
  32.   mov     FontSeg,es
  33.   { Segment, in dem der Font abgelegt ist }
  34.   mov     FontOfs,bp
  35.   { Offset des Fonts }
  36. end;
  37.  
  38. procedure Scroll;
  39. var I,J : word;
  40.     CharPos,CharNo,Color,Character : byte;
  41.  
  42. begin
  43.   CharNo := 1;                   { Anfangsposition }
  44.   repeat
  45.     Character := ord(Text[CharNo]);
  46.     { ASCII-Code holen }
  47.     for CharPos := 0 to 7 do begin  { 8x8 Pixel je }
  48.       for I := 0 to 7 do begin      { Zeichen      }
  49.         if mem[FontSeg:FontOfs+(Character*8)+I] and
  50.            Bits[CharPos] <> 0 then Color := 31
  51.         else Color := black;
  52.         { Wenn daß entsprechende Bit gesetzt ist,  }
  53.         { dann Farbe weiß (31) setzen, andernfalls }
  54.         { schwarz.                                 }
  55.         mem[$A000:((100+I)*320)+319] := Color;
  56.         { Pixel setzen }
  57.       end;
  58.       WaitRetrace;
  59.       for J := 0 to 7 do for I := 0 to 318 do
  60.         mem[$A000:((100+J)*320)+I] :=
  61.           mem[$A000:((100+J)*320)+1+I];
  62.       { Alles um einen Pixel nach links bewegen }
  63.     end;
  64.     inc(CharNo);
  65.     if CharNo > length(Text) then CharNo := 1;
  66.   until keypressed;
  67.   readkey;
  68. end;
  69.  
  70.  
  71. begin
  72.   GetFont;
  73.   asm mov ax,13h; int 10h end;    { VGA-Modus 13h }
  74.   Scroll;
  75.   asm mov ax,03h; int 10h end;        { Textmodus }
  76. end.
  77.